package com.itheima.dao;

import com.itheima.pojo.LinkMan;
import com.itheima.pojo.LinkManInfo;
import com.itheima.pojo.QueryBean;

import java.util.List;
import java.util.Map;

/**
 * 包名:com.itheima.dao
 *
 * 一、参数类型
 * 原则: 使用mybatis的所有Dao的接口，参数个数都只能有一个
 * 1. 如果只需要往SQL语句中传入一个数据，那么参数类型就使用简单类型(String、基本类型、包装类)
 * 2. 如果需要往SQL语句中传入多个数据，那么参数类型就使用POJO或者Map
 * 3. 如果是更加复杂的数据传递，我们还可以使用POJO的包装类，其实就是POJO里面的属性又是另外一个POJO
 * 例如:
 * User:
 *  nickname、introduce、Card、address
 * Card:
 *  name、number、address、birthday
 *
 * 二、结果类型
 * 原则:
 * 1. 如果是查询单个数据，则方法的返回值类型是简单类型;resultType 就是这些简单类型的别名(int、string)
 *    比如查询数据的总条数，那么结果就是Long类型。查询id为1的用户的name，结果就是String类型
 * 2. 如果查询一条数据，则方法的返回值类型是POJO或者是Map；resultType就是POJO或者是Map的别名
 * 3. 如果查询多条数据，则方法的返回值类型为List<POJO>、List<Map>; resultType就是POJO或者Map的别名
 *
 * 以上的方式我们是使用resultType属性进行自动映射，它会将这一行数据的各个字段的值自动设置到POJO的各个属性，框架底层是使用反射(内省)根据POJO的属性名和
 * 结果集的字段名进行匹配；
 *
 * 如果结果集的字段名和POJO的属性名不一致的情况下，就需要我们手动通过resultMap进行结果集的映射
 *
 */
public interface LinkManDao {
    /**
     * 根据id查询联系人信息
     * @param id
     * @return
     */
    LinkMan findById(Integer id);

    /**
     * 根据性别和地址查询联系人信息
     * @param parameterMap
     */
    List<LinkMan> findBySexAndAddress(Map parameterMap);

    /**
     * 根据用户的用户名进行搜索
     * @param bean
     * @return
     */
    List<LinkMan> query(QueryBean bean);

    /**
     * 查询联系人的总个数
     * @return
     */
    long findTotalCount();

    /**
     * 根据id查询用户的姓名、性别、地址
     * @param id
     * @return
     */
    Map findOneById(int id);

    /**
     * 查询所有联系人的姓名和地址
     * @return
     */
    List<Map> findAll();

    /**
     * 查询所有用户信息
     * 并且将每一个用户的信息，封装到一个LinkManInfo对象中
     * @return
     */
    List<LinkManInfo> findAllLinkManInfo();

    /**
     * 根据联系人的address查询联系人
     * @param address
     * @return
     */
    List<LinkMan> findByAddress(String address);

    /**
     * 测试if和where标签的使用
     * @param linkMan
     * @return
     */
    List<LinkMan> findByAddressAndSex(LinkMan linkMan);

    /**
     * 批量删除
     * @param ids
     * @return
     */
    int deleteByIds(List<Integer> ids);
}
